﻿//98. 验证二叉搜索树
//给你一个二叉树的根节点 root ，判断其是否是一个有效的二叉搜索树。
//有效 二叉搜索树定义如下：
//节点的左子树只包含 小于 当前节点的数。
//节点的右子树只包含 大于 当前节点的数。
//所有左子树和右子树自身必须也是二叉搜索树
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool istrue(TreeNode* root, long long min, long long max)
    {
        if (!root) return true;
        if (root->val <= min || root->val >= max)
        {
            return false;
        }
        return istrue(root->left, min, root->val) && istrue(root->right, root->val, max);
        //[min,root->val] [root->val,max]
    }
    bool isValidBST(TreeNode* root)
    {
        return istrue(root, LONG_MIN, LONG_MAX);
    }
};